package controllers

import (
	"os"
    "net"
    "fmt"
	"time"
	"io/ioutil"
	"net/http"
	"net/url"
	"bee-api/models"
	"encoding/json"
	//"errors"
	//"strconv"
	//"strings"
	"github.com/astaxie/beego"
)

// 定义控制器
type JuheController struct {
	beego.Controller
}

// URLMapping ...
func (c *JuheController) URLMapping() {
   	c.Mapping("getWifiInfoByLatLng", c.GetWifiInfoByLatLng)
   	c.Mapping("getWifiInfoByCity", c.GetWifiInfoByCity)
}
  
//----------------------------------
// 全国WIFI调用示例代码 － 聚合数据
// 在线接口文档：http://www.juhe.cn/docs/18
//----------------------------------
  
// 查询周边WIFI
// getWifiInfoByLatLng ...
// @Title get Wifi Info By Lat Lng
// @Description get Juhe
// @router /GetWifiInfoByLatLng [get]
func (c *JuheController) GetWifiInfoByLatLng(){

	// 接受请求参数
	lon := c.Ctx.Input.Query("lon")
	lat := c.Ctx.Input.Query("lat")
	gtype := c.Ctx.Input.Query("gtype")
	r := c.Ctx.Input.Query("range")

   	//fmt.Printf(lat)

	// 判断经纬度信息 121.528434 31.207484
	if lon == "" || lat == "" {

		errMsg := map[string] string{
			"code": "10001",
			"msg": "经纬度信息不能为空",
		}

		c.Data["json"] = errMsg
		c.ServeJSON()
	}
	// 判断坐标系类型 1：百度  2：谷歌 3：gps
	if gtype == "" {
	  	gtype = "2"
	}
	// 判断搜索范围 单位M，默认3000
	if r == "" {
	  	r = "3000"
	}

	// 请求地址
	juheURL := "http://apis.juhe.cn/wifi/local"

	// 初始化参数
	param := url.Values{}

	// 配置请求参数,方法内部已处理urlencode问题,中文参数可以直接传参
	param.Set("lon",lon)          //经纬(如: 121.538123)
	param.Set("lat",lat)          //纬度(如：31.677132)
	param.Set("gtype",gtype)      //坐标系 1：百度  2：谷歌 3：gps
	param.Set("r",r)              //搜索范围，单位M，默认3000
	param.Set("key",beego.AppConfig.String("juheappkey"))       //应用APPKEY(应用详细页查询)
	param.Set("dtype","json")     //返回数据的格式,xml或json，默认json

   	// 发送请求
   	data,err := Get(juheURL,param)

	if err != nil {
	  	c.Data["json"] = err.Error()
	} else {
		// 定义无类型数据集合
		var netReturn map[string]interface{}
		json.Unmarshal(data,&netReturn)

		//fmt.Println(netReturn)

		if netReturn["error_code"].(float64) == 0 {
		 	shuju := netReturn["result"].(map[string]interface{})
            data := make(map[string]interface{})
            data["code"] = "0000"
            data["msg"] = "请求成功"
            data["data"] = shuju["data"]
		 	c.Data["json"] = data
		}else{
			errMsg := map[string] string{
				"code": "10014",
				"msg": "系统内部异常",
			}
			c.Data["json"] = errMsg
		}
	}
	// 获取ip信息
	ips, _ := GetIps()
	req := c.Ctx.Request
	addr := req.RemoteAddr // "IP:port" "192.168.1.150:8889"
	fmt.Println("ip地址 :",addr)
	// 获取当前时间
	nowDate := time.Now().Format("2006-01-02 15:04:05")
	// 记录调用信息
	AddApiLog := &models.AddApiLogStruct{
		Explain: 	"根据经纬度获取周边WIFI信息",
		CreateDate: nowDate,
		Ip:			ips,
		ApiUrl:     juheURL,
	}

	appLog := make(map[string]string)

	appLog, _, _ = AddApiLog.ApiLogSave()

	fmt.Println("applog info :",appLog)

	c.ServeJSON()
}
  
// 按城市查询WIFI
// getWifiInfoByCity ...
// @Title get Wifi Info By City
// @Description get Juhe
// @router /GetWifiInfoByCity [get]
func (c *JuheController) GetWifiInfoByCity(){

	// 接受请求参数
	city := c.Ctx.Input.Query("city")
	page := c.Ctx.Input.Query("page")

	if city == "" {
		city = "上海市"
	}

	if page == "" {
		page = "1"
	}

	// 请求地址
	juheURL := "http://apis.juhe.cn/wifi/region"

	// 初始化参数
	param := url.Values{}

	// 配置请求参数,方法内部已处理urlencode问题,中文参数可以直接传参
	param.Set("city",city)        //城市名urlencode utf8;
	param.Set("page",page)        //页数，默认1
	param.Set("key",beego.AppConfig.String("juheappkey"))       //应用APPKEY(应用详细页查询)
	param.Set("dtype","json")     //返回数据的格式,xml或json，默认json


   	// 发送请求
   	data,err := Get(juheURL,param)

   	if err != nil{
		c.Data["json"] = err.Error()
   	}else{
		var netReturn map[string]interface{}
		json.Unmarshal(data,&netReturn)
		if netReturn["error_code"].(float64) == 0{
			shuju := netReturn["result"].(map[string]interface{})
			data := make(map[string]interface{})
			data["code"] = "0000"
			data["msg"] = "请求成功"
            data["data"] = shuju["data"]
			c.Data["json"] = data
		}else{
			errMsg := map[string] string{
				"code": "10014",
				"msg": "系统内部异常",
			}
			c.Data["json"] = errMsg
		}
   	}

   	// 获取ip信息
	ips, _ := GetIps()
	// 获取当前时间
	nowDate := time.Now().Format("2006-01-02 15:04:05")
	// 记录调用信息
	AddApiLog := &models.AddApiLogStruct{
		Explain: 	"根据城市获取周边WIFI信息",
		CreateDate: nowDate,
		Ip:			ips,
		ApiUrl:     juheURL,
	}

	appLog := make(map[string]string)

	appLog, _, _ = AddApiLog.ApiLogSave()

	fmt.Println("applog info :",appLog)

   	c.ServeJSON()
}
  
// get 网络请求
func Get(apiURL string,params url.Values)(rs[]byte ,err error){

    var Url *url.URL
    Url,err = url.Parse(apiURL)

    if err != nil{
        fmt.Printf("解析url错误:\r\n%v",err)
        return nil,err
    }

    // 如果参数中有中文参数,这个方法会进行URLEncode
    Url.RawQuery = params.Encode()
    resp,err := http.Get(Url.String())

    if err != nil{
        fmt.Println("err:",err)
        return nil,err
    }

    defer resp.Body.Close()
    return ioutil.ReadAll(resp.Body)
}
  
// post 网络请求 ,params 是url.Values类型
func Post(apiURL string, params url.Values)(rs[]byte,err error){

    resp,err := http.PostForm(apiURL, params)

    if err != nil{
      return nil ,err
    }
    defer resp.Body.Close()
    return ioutil.ReadAll(resp.Body)
}

// 自定义错误码
func ErrCodeMsg(codeM string) (data map[string]interface{},err error) {

    // 自定义结构体，存储错误码和错误信息
    type errCode struct {
        code int
        msg string
    }

    myErrMsg := map[string] errCode{
        "10001" : errCode{10001 , "错误的请求KEY"},
        "10002" : errCode{10002 , "该KEY无请求权限"},
        "10003" : errCode{10003 , "KEY过期"},
        "10004" : errCode{10004 , "错误的OPENID"},
        "10005" : errCode{10005 , "应用未审核超时，请提交认证"},
        "10007" : errCode{10007 , "未知的请求源"},
        "10008" : errCode{10008 , "被禁止的IP"},
        "10009" : errCode{10009 , "被禁止的KEY"},
        "10011" : errCode{10011 , "当前IP请求超过限制"},
        "10012" : errCode{10012 , "请求超过次数限制"},
        "10013" : errCode{10013 , "测试KEY超过请求限制"},
        "10014" : errCode{10014 , "系统内部异常(调用充值类业务时，请务必联系客服或通过订单查询接口检测订单，避免造成损失)"},
        "10020" : errCode{10020 , "接口维护"},
        "10021" : errCode{10021 , "接口停用"},
        "10022" : errCode{10022 , "经纬度信息不能为空"},
        "201801" : errCode{201801 , "错误的经纬度"},   
        "201802" : errCode{201802 , "城市区号不能为空"},
        "201803" : errCode{201803 , "查询无结果"},   
        "201805" : errCode{201805 , "周边查询无结果"},
    }

    fmt.Println(myErrMsg[codeM])

    if err != nil {
        fmt.Println("xx")
    }

    return
}

/**
 * 获取ip信息
 */
func GetIps() (ips string, err error) {

	addrs, err := net.InterfaceAddrs()
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }

    for _, address := range addrs {
        // 检查ip地址判断是否回环地址
        if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
            if ipnet.IP.To4() != nil {
                fmt.Println(ipnet.IP.String())
             	ips = ipnet.IP.String()
            }
        }
    }
    return
}













